﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using CondominioWeb.Negocio;
using CondominioWeb.Dominio;
using CondominioWeb.Persistencia.NHibernate;

namespace CondominioWeb.Pruebas
{
    public class TestAdministracionService
    {
        private IApplicationContext Spring;

        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            //"assembly://assembly/namespace/capaPersistencia.xml",
            Spring = new XmlApplicationContext(
                "assembly://CondominioWeb/CondominioWeb/capaPersistencia.xml",
                "assembly://CondominioWeb/CondominioWeb/capaNegocio.xml"
                );
        }
        [Test]
        public void TestRegistrarResidente()
        {
            //
            AdministracionService administracionService = (AdministracionService)Spring.GetObject("administracionService");
            Assert.NotNull(administracionService);
            Residente oResidente = null;
            Assert.DoesNotThrow(delegate
            {
                oResidente = administracionService.RegistrarResidente(1, 1, "21863222", "Miguel", "Pachas", DateTime.Now, "mp@hotmail.com", "123", "Activo", 1);
            });
            Assert.NotNull(oResidente);
            Assert.AreEqual(oResidente.CodigoResidente, 1);

        }
        [Test]
        public void TestResidenteObtener()
        {
            AdministracionService administracionService = (AdministracionService)Spring.GetObject("administracionService");
            Assert.NotNull(administracionService);
            Residente oResidente = null;
            oResidente = administracionService.ResidenteObtener(1);
            Assert.IsNotNull(oResidente);
            Assert.AreEqual(oResidente.CodigoResidente, 1);

        }

        [Test]
        public void TestRegistrarVivienda()
        {
            // Pruebas
            // Nro        : 001
            // Descripción: Creación correcta de vivienda, 
            // Resultado  : Debe retornar un objeto válido en la correcta ejecución.

            //Pre condiciones
            ViviendaDAO dao_viveli = (ViviendaDAO)Spring.GetObject("viviendaDAO");
            Vivienda eliminavivienda = dao_viveli.Obtener(2000);

            if (eliminavivienda != null)
                dao_viveli.Eliminar(eliminavivienda);

            //Ejecución de pruebas
            AdministracionService administracionService = (AdministracionService)Spring.GetObject("administracionService");
            Assert.NotNull(administracionService);
            Vivienda nuevaVivienda = null;
            Assert.DoesNotThrow(delegate
            {
                nuevaVivienda = administracionService.RegistrarVivienda(2000,
                                                                        @"Vivienda familiar",
                                                                        1,
                                                                        120.0,
                                                                        1,
                                                                        1,
                                                                        1,
                                                                        1,
                                                                        "ACTIVO");
            });
            Assert.NotNull(nuevaVivienda);
            Assert.AreEqual(nuevaVivienda.Codigo_Vivienda, 2000);
            
            // Nro        : 002
            // Descripción: Control de excepcion de codigo de vivienda repetido
            // Resultado  : Debe null porque no se puede crear una vivienda 2 veces.
            
            //Pre condiciones
            nuevaVivienda = null;
            int CodigoViviendaExistente = 2000;

            //Ejecución de pruebas
            Assert.Catch<Exception>(delegate
            {
                nuevaVivienda = administracionService.RegistrarVivienda(CodigoViviendaExistente,
                                                                        @"Vivienda familiar",
                                                                        1,
                                                                        120.0,
                                                                        1,
                                                                        1,
                                                                        1,
                                                                        1,
                                                                        "ACTIVO");
            });
            Assert.IsNull(nuevaVivienda);
        }



        [Test]
        public void TestRegistrarCuota()
        {
            // Pruebas
            // Nro        : 001
            // Descripción: Creación correcta de cuotas, 
            // Resultado  : Debe retornar un objeto válido en la correcta ejecución.

            //Pre condiciones
            MantenimientoDAO dao_cuoeli = (MantenimientoDAO)Spring.GetObject("mantenimientoDAO");
            Mantenimiento eliminacuota = dao_cuoeli.Obtener(1000);

            if (eliminacuota != null)
                dao_cuoeli.Eliminar(eliminacuota);

            AdministracionService administracionService = (AdministracionService)Spring.GetObject("administracionService");
            Assert.NotNull(administracionService);
            Mantenimiento nuevaCuota = null;
            Assert.DoesNotThrow(delegate
            {
                nuevaCuota = administracionService.RegistrarCuota(1000,
                                                                  1000,
                                                                  2011,
                                                                  1,
                                                                  75.00,
                                                                  DateTime.Now,
                                                                  DateTime.Now.AddDays(30),
                                                                  "Cobro normal",
                                                                  2,
                                                                  "ACTIVO");
            });
            Assert.NotNull(nuevaCuota);
            Assert.AreEqual(nuevaCuota.Codigo_Mantenimiento, 1000);

            // Nro        : 002
            // Descripción: Control de excepcion de codigo de pago repetido
            // Resultado  : Debe null porque no se puede crear un pago 2 veces.

            //Pre condiciones
            nuevaCuota = null;
            int CodigoViviendaExistente = 1000;

            //Ejecución de pruebas
            Assert.Catch<Exception>(delegate
            {
                nuevaCuota = administracionService.RegistrarCuota(1000,
                                                                  CodigoViviendaExistente,
                                                                  2011,
                                                                  1,
                                                                  75.00,
                                                                  DateTime.Now,
                                                                  DateTime.Now.AddDays(30),
                                                                  "Cobro normal",
                                                                  2,
                                                                  "ACTIVO");
            });
            Assert.IsNull(nuevaCuota);

        }
       
        [Test]
        public void TestRegistrarAreaComun()
        {
            //
            AdministracionService administracionService = (AdministracionService)Spring.GetObject("administracionService");
            Assert.NotNull(administracionService);
            Area_Comun NuevaAreaComun = null;
            Assert.DoesNotThrow(delegate
            {
                NuevaAreaComun = administracionService.CrearAreaComun(4, 1, 2, 10, "1");
                Assert.NotNull(NuevaAreaComun);
                Assert.AreEqual(NuevaAreaComun.Codigo_Area_Comun, 2);
            });

            Assert.Catch<Exception>(delegate
            {

                NuevaAreaComun = administracionService.CrearAreaComun(2, 1, 2, 10, "1");
            });



        }
         [Test]
        public void TestActualizarAreaComun()
        {
            //
            AdministracionService administracionService = (AdministracionService)Spring.GetObject("administracionService");
            Assert.NotNull(administracionService);
            Area_Comun NuevaAreaComun = null;
            Assert.DoesNotThrow(delegate
            {
                NuevaAreaComun = administracionService.ModificarAreaComun(2, 1, 2, 15, "1");
            });
            Assert.NotNull(NuevaAreaComun);
            Assert.AreEqual(NuevaAreaComun.Codigo_Area_Comun, 2);
        }
        [Test]
        public void TestRegistrarReserva()
        {
            //
            AdministracionService administracionService = (AdministracionService)Spring.GetObject("administracionService");
            Assert.NotNull(administracionService);
            Reserva NuevaReserva = null;
            //Assert.DoesNotThrow(delegate
            //{
                NuevaReserva = administracionService.CrearReserva(4,Convert.ToDateTime("10/12/2011"), 2, 12, 
                                                        "1",Convert.ToDateTime("13/12/2011"),1,"1");
            //});
            Assert.NotNull(NuevaReserva);
            Assert.AreEqual(NuevaReserva.Codigo, 2);
        
        }
    }
}